package com.hsu.hsurpc.loadbalancer;

import com.hsu.hsurpc.model.ServiceMetaInfo;

import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 轮询负载均衡器
 * @Author Hsu琛君珩
 * @Date 2024-09-24 15:38
 * @Description
 * @Version: v1.0.0
 */
public class RoundRobinLoadBalancer implements LoadBalancer {

    /**
     * 当前轮询的下标
     * 使用 AtomicInteger 确保在多线程环境下的安全递增操作。
     */
    private final AtomicInteger currentIndex = new AtomicInteger(0);

    /**
     * 从服务节点列表中选择一个节点
     * 如果只有一个节点，则直接返回该节点；如果没有节点则返回 null。
     * 多个节点时，根据当前下标值取模服务节点数量，选择相应的服务节点。
     *
     * @param requestParams      请求参数，用于选择服务节点时的参考（此实现中未使用）
     * @param serviceMetaInfoList 服务节点的元数据信息列表，包含所有可用的服务节点
     * @return 返回通过轮询方式选择的服务节点的元数据信息
     */
    @Override
    public ServiceMetaInfo select(Map<String, Object> requestParams, List<ServiceMetaInfo> serviceMetaInfoList) {
        if (serviceMetaInfoList.isEmpty()) {
            return null;
        }
        int size = serviceMetaInfoList.size();
        // 如果只有一个服务节点，直接返回该节点
        if (size == 1) {
            return serviceMetaInfoList.get(0);
        }
        // 使用取模算法实现轮询，获取当前的下标并对节点数量取模
        int index = currentIndex.getAndIncrement() % size;
        return serviceMetaInfoList.get(index); // 返回对应的服务节点
    }
}
